/*************************************************************************
    > File Name: D.Solving_Zombie_Method_two.c
    > Author: Ykk
    > Mail: 3393579535@qq.com 
    > Created Time: 2023年05月03日 星期三 21时31分30秒
 ************************************************************************/

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

#include<signal.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>

void fun(int signo)
{
	pid_t pid = -1;

	//处理僵尸进程，-1代表等待任意一个子进程，WNOHANG代表不阻塞
    while((pid = waitpid(-1, NULL, WNOHANG)) > 0)
	{
		printf("子进程%d终止..\n",pid);
	}
}
 
int main()
{
	pid_t pid = -1;
	
	//创建捕捉子进程退出信号
	//只要子进程退出，触发SIGCHLD，自动调用fun()
	signal(SIGCHLD,fun);

	//创建一个子进程
	pid = fork();
	if(-1 == pid)
	{
		perror("fork");
		return 1;
	}

	//子进程
	if(0 ==  pid)
	{
		printf("子进程%d退出..\n",getpid());
		exit(0);
	}
	else
	{
		//父进程
		sleep(2);
		printf("父进程工作..\n");
		system("ps -ef | grep defunct");
	}
	return 0;
}
